package ecpay

import (
	"context"
	"net/http"
)

const (
	apiSettle = "v1/settle"
	apiQuerySettle = "v1/query_settle"
)

// SettleRequest 分账请求
type SettleRequest struct {
	baseBody
	AppID             string            `json:"app_id,omitempty"`              // 必传	小程序id
	OutSettleNo       string            `json:"out_settle_no,omitempty"`       // 必传	商户分账单号
	OutOrderNo        string            `json:"out_order_no,omitempty"`        // 必传	进行分账的商户订单
	SettleAmount      int64             `json:"settle_amount,omitempty"`       // 必传	金额，整型（单位：分）需要与订单金额保持一致（微信扣减手续费）
	SettleDesc        string            `json:"settle_desc,omitempty"`         // 必传	分账描述
	OtherSettleParams []SettleParameter `json:"other_settle_params,omitempty"` // 选传	SettleParameter数组，其他分账方分配明细，数组，可以传入多个。
	LimitType         int64             `json:"limit_type,omitempty"`          // 选传	服务商分账模式下，分账限额模式,0-比例分配模式；1-固定金额限额、默认为0
	NotifyURL         string            `json:"notify_url,omitempty"`          // 选传	自定义回调Url，非必传，会覆盖平台回调地址
	CpExtra           string            `json:"cp_extra,omitempty"`            // 选传	自定义字段，回调时传回
}

// SettleParameter 分账参数
type SettleParameter struct {
	MerchantUid string `json:"merchant_uid"`
	Amount      string `json:"amount"`
}

// SettleResponse 分账返回
type SettleResponse struct {
	SettleNo string `json:"settle_no"` // 平台生成分账单号
}

// Settle 分账
func (c Client) Settle(ctx context.Context, req *SettleRequest) (*SettleResponse, error) {
	r, err := c.NewRequest(http.MethodPost, apiSettle, req)
	if err != nil {
		return nil, err
	}
	resp := new(SettleResponse)
	err = c.Do(ctx, r, resp)
	if err != nil {
		return nil, err
	}
	return resp, err
}

// QuerySettleRequest 查询分账请求
type QuerySettleRequest struct {
	baseBody
	AppID        string `json:"app_id,omitempty"`        // 必传 	小程序平台分配的 app_id
	ThirdPartyID string `json:"thirdparty_id,omitempty"` // 选传	服务商鉴权模式下，用于标识服务商身份，配合sign进行验签
	OutSettleNo  string `json:"out_settle_no,omitempty"` // 必传	商户侧，外部分账单号
}

// QuerySettleResponse 查询分账返回
type QuerySettleResponse struct {
	SettleInfo struct{
		SettleNo	string	// 小程序侧分账单号
		SettleAmount	int64	// 分账金额
		SettleStatus	string	// 分账状态状态，包含SUCCESS ，FAIL ，PROCESSING
	} `json:"settle_info,omitempty"`
}


// QuerySettle 查询分账
func (c Client) QuerySettle(ctx context.Context, req *QuerySettleRequest) (*QuerySettleResponse, error) {
	r, err := c.NewRequest(http.MethodPost, apiQuerySettle, req)
	if err != nil {
		return nil, err
	}
	resp := new(QuerySettleResponse)
	err = c.Do(ctx, r, resp)
	if err != nil {
		return nil, err
	}
	return resp, err
}